package com.unism.objType;

import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;

import com.unism.util.StringUtil;

public class ObjectTypeConfig {
	
	public static TreeMap<Integer, ObjectType> enableMap = new TreeMap<Integer, ObjectType>();

	private static ObjectTypeConfig config;
	
	
	/**
	 * 
	 * 得到唯一实例
	 * 
	 * @return
	 */
	public static ObjectTypeConfig getInstance() {
		if (config == null) {
			config = new ObjectTypeConfig();
		}
		return config;
	}

	/**
	 * 判断设备type是gprs设备吗?
	 * @param deviceType
	 * @return
	 */
	public static boolean isGprs(int deviceType) {
		Iterator<Integer> it = enableMap.keySet().iterator();  
        while (it.hasNext()) {  
        	ObjectType oType = enableMap.get(it.next());
        	if (oType.getDeviceType() == deviceType) {
				if (1 == oType.getSerial()) {
					return true;
				}else {
					return false;
				}
			}
        }  
        return false;
	}
	/**
	 * 判断设备type是gprs设备吗?
	 * @param deviceType
	 * @return
	 */
	public static Integer getDeviceTypeByAT(Integer appTypeId) {
		Iterator<Integer> it = enableMap.keySet().iterator();  
        while (it.hasNext()) {
        	ObjectType oType = enableMap.get(it.next());
        	List<AppType> appTypes = oType.getAppTypes();
        	for (AppType appType : appTypes) {
				if (appTypeId.equals(Integer.parseInt(appType.getId()))) {
					return oType.getDeviceType();
				}
			}
        }  
        return null;
	}
	private ObjectTypeConfig() {
	}

	/**
	 * 初始化配置
	 * 
	 * @param fileUrl
	 * @throws MtException
	 */
	public void init(URL fileUrl) throws Exception {
		parseOptions(createDom(fileUrl));
	}

	/**
	 * 
	 * @return
	 */
	private Document createDom(URL configFileURL) throws Exception {
		if (configFileURL == null) {
			throw new Exception("没有得到配置文件!", null);
		}
		Document doc = null;
		try {
			SAXBuilder sb = new SAXBuilder();
			doc = sb.build(configFileURL);
			if (doc == null) {
				throw new Exception("没有生成配置文件的DOM对象!", null);
			}
		} catch (Exception e) {
			throw new Exception("生成配置文件的DOM对象失败!", e);
		}
		return doc;
	}

	/**
	 * 分析命令配置
	 * 
	 * @throws ACException
	 */
	public Map<Integer, ObjectType> parseOptions(Document doc) throws Exception {
		Element root = doc.getRootElement();
		if (root == null) {
			throw new Exception("没有得到配置文件根元素config!");
		}
		List<Element> objectList = root.getChildren("instance");
		if (objectList == null) {
			return enableMap;
		}
		Iterator<Element> git = objectList.iterator();
		Element object = null;
		int objType ;

		while (git.hasNext()) {
			object = (Element) git.next();
			objType = Integer.parseInt(object.getAttributeValue("objType"));
			
			ObjectType objectType = new ObjectType();
			objectType.setObjName(object.getAttributeValue("objName"));
			objectType.setShape(object.getAttributeValue("shape"));
			objectType.setEnable(Boolean.parseBoolean(object.getAttributeValue("enable")));
			objectType.setSerial(Integer.parseInt(object.getAttributeValue("serial")));			
			objectType.setDeviceType(Integer.parseInt(object.getAttributeValue("deviceType")));
			
			//提取应用类型数组
			List<AppType> appTypes = new ArrayList<AppType>();
			List<Element> aTypes = object.getChild("apptypes").getChildren("apptype");
			for (Element aType : aTypes) {
				appTypes.add(parseAppTypeElement(aType));
			}
			objectType.setAppTypes(appTypes);
			
			enableMap.put(objType, objectType);
		}

		return enableMap;
	}
	private AppType parseAppTypeElement(Element e) {
		AppType at = new AppType();
		String id = e.getAttributeValue("id");
		if (!StringUtil.isBlank(id)) 
			at.setId(id);
		String name = e.getAttributeValue("name");
		if (!StringUtil.isBlank(name))
			at.setName(name);
		String p1 = e.getAttributeValue("P1");
		if (!StringUtil.isBlank(p1))
			at.setP1(Integer.valueOf(p1));
		String p2 = e.getAttributeValue("P2");
		if (!StringUtil.isBlank(p2))
			at.setP2(Integer.valueOf(p2));
		String p3 = e.getAttributeValue("P3");
		if (!StringUtil.isBlank(p3))
			at.setP3(Integer.valueOf(p3));
		String p4 = e.getAttributeValue("P4");
		if (!StringUtil.isBlank(p4))
			at.setP4(Integer.valueOf(p4));
		String p5 = e.getAttributeValue("P5");
		if (!StringUtil.isBlank(p5))
			at.setP5(Integer.valueOf(p5));
		String p6 = e.getAttributeValue("P6");
		if (!StringUtil.isBlank(p6))
			at.setP6(Integer.valueOf(p6));
		String p7 = e.getAttributeValue("P7");
		if (!StringUtil.isBlank(p7))
			at.setP7(Integer.valueOf(p7));
		String p8 = e.getAttributeValue("P8");
		if (!StringUtil.isBlank(p8))
			at.setP8(Integer.valueOf(p8));
		String p9 = e.getAttributeValue("P9");
		if (!StringUtil.isBlank(p9))
			at.setP9(Integer.valueOf(p9));
		String p10 = e.getAttributeValue("P10");
		if (!StringUtil.isBlank(p10))
			at.setP10(Integer.valueOf(p10));
		String p11 = e.getAttributeValue("P11");
		if (!StringUtil.isBlank(p11))
			at.setP11(Integer.valueOf(p11));
		String p12 = e.getAttributeValue("P12");
		if (!StringUtil.isBlank(p12))
			at.setP12(Integer.valueOf(p12));
		String p13 = e.getAttributeValue("P13");
		if (!StringUtil.isBlank(p13))
			at.setP13(Integer.valueOf(p13));

		String p14 = e.getAttributeValue("P14");
		if (!StringUtil.isBlank(p14))
			at.setP14(Integer.valueOf(p14));

		String p15 = e.getAttributeValue("P15");
		if (!StringUtil.isBlank(p15))
			at.setP15(Integer.valueOf(p15));

		String p16 = e.getAttributeValue("P16");
		if (!StringUtil.isBlank(p16))
			at.setP16(Integer.valueOf(p16));

		String p17 = e.getAttributeValue("P17");
		if (!StringUtil.isBlank(p17))
			at.setP17(Integer.valueOf(p17));

		String p18 = e.getAttributeValue("P18");
		if (!StringUtil.isBlank(p18))
			at.setP18(Integer.valueOf(p18));

		String p19 = e.getAttributeValue("P19");
		if (!StringUtil.isBlank(p19))
			at.setP19(Integer.valueOf(p19));

		String p20 = e.getAttributeValue("P20");
		if (!StringUtil.isBlank(p20))
			at.setP20(Integer.valueOf(p20));

		String p21 = e.getAttributeValue("P21");
		if (!StringUtil.isBlank(p21))
			at.setP21(Integer.valueOf(p21));

		String p22 = e.getAttributeValue("P22");
		if (!StringUtil.isBlank(p22))
			at.setP22(Integer.valueOf(p22));

		String p23 = e.getAttributeValue("P23");
		if (!StringUtil.isBlank(p23))
			at.setP23(Integer.valueOf(p23));

		String p24 = e.getAttributeValue("P24");
		if (!StringUtil.isBlank(p24))
			at.setP24(Integer.valueOf(p24));

		String p25 = e.getAttributeValue("P25");
		if (!StringUtil.isBlank(p25))
			at.setP25(Integer.valueOf(p25));

		String p26 = e.getAttributeValue("P26");
		if (!StringUtil.isBlank(p26))
			at.setP26(Integer.valueOf(p26));

		String p27 = e.getAttributeValue("P27");
		if (!StringUtil.isBlank(p27))
			at.setP27(Integer.valueOf(p27));

		String p28 = e.getAttributeValue("P28");
		if (!StringUtil.isBlank(p28))
			at.setP28(Integer.valueOf(p28));

		String p29 = e.getAttributeValue("P29");
		if (!StringUtil.isBlank(p29))
			at.setP29(Integer.valueOf(p29));

		String p30 = e.getAttributeValue("P30");
		if (!StringUtil.isBlank(p30))
			at.setP30(Integer.valueOf(p30));

		String p31 = e.getAttributeValue("P31");
		if (!StringUtil.isBlank(p31))
			at.setP31(Integer.valueOf(p31));

		String p32 = e.getAttributeValue("P32");
		if (!StringUtil.isBlank(p32))
			at.setP32(Integer.valueOf(p32));

		String p33 = e.getAttributeValue("P33");
		if (!StringUtil.isBlank(p33))
			at.setP33(Integer.valueOf(p33));

		String p34 = e.getAttributeValue("P34");
		if (!StringUtil.isBlank(p34))
			at.setP34(Integer.valueOf(p34));

		String p35 = e.getAttributeValue("P35");
		if (!StringUtil.isBlank(p35))
			at.setP35(Integer.valueOf(p35));

		String p36 = e.getAttributeValue("P36");
		if (!StringUtil.isBlank(p36))
			at.setP36(Integer.valueOf(p36));

		String p37 = e.getAttributeValue("P37");
		if (!StringUtil.isBlank(p37))
			at.setP37(Integer.valueOf(p37));

		String p38 = e.getAttributeValue("P38");
		if (!StringUtil.isBlank(p38))
			at.setP38(Integer.valueOf(p38));

		String p39 = e.getAttributeValue("P39");
		if (!StringUtil.isBlank(p39))
			at.setP39(Integer.valueOf(p39));

		String p40 = e.getAttributeValue("P40");
		if (!StringUtil.isBlank(p40))
			at.setP40(Integer.valueOf(p40));

		String p41 = e.getAttributeValue("P41");
		if (!StringUtil.isBlank(p41))
			at.setP41(Integer.valueOf(p41));

		String p42 = e.getAttributeValue("P42");
		if (!StringUtil.isBlank(p42))
			at.setP42(Integer.valueOf(p42));

		String p43 = e.getAttributeValue("P43");
		if (!StringUtil.isBlank(p43))
			at.setP43(Integer.valueOf(p43));

		String p44 = e.getAttributeValue("P44");
		if (!StringUtil.isBlank(p44))
			at.setP44(Integer.valueOf(p44));

		String p45 = e.getAttributeValue("P45");
		if (!StringUtil.isBlank(p45))
			at.setP45(Integer.valueOf(p45));
		
		String p46 = e.getAttributeValue("P46");
		if (!StringUtil.isBlank(p46))
			at.setP46(Integer.valueOf(p46));
		
		String p47 = e.getAttributeValue("P47");
		if (!StringUtil.isBlank(p47))
			at.setP47(Integer.valueOf(p47));
		
		String p48 = e.getAttributeValue("P48");
		if (!StringUtil.isBlank(p48))
			at.setP48(Integer.valueOf(p48));
		
		String p49 = e.getAttributeValue("P49");
		if (!StringUtil.isBlank(p49))
			at.setP49(Integer.valueOf(p49));
		
		String p50 = e.getAttributeValue("P50");
		if (!StringUtil.isBlank(p50))
			at.setP50(Integer.valueOf(p50));
		
		String p51 = e.getAttributeValue("P51");
		if (!StringUtil.isBlank(p51))
			at.setP51(Integer.valueOf(p51));
		
		return at;
	}
}
